package com.itheima.d1_algorithm;

import java.util.Arrays;

/**
 *  目标：掌握选择排序。
 *  每轮选择当前位置，开始找出后面的较小值与该位置交换
 *
 * 确定总共需要选择几轮： 数组的长度-1.
 * 控制每轮从以前位置为基准，与后面元素选择几次。
 *
 * 和冒泡不一样，冒泡是两两之间相互比较，选择排序是定位思想，每一轮比较选择一个位置的元素，然后让该元素和其他元素比较
 */
public class Test2 {
    public static void main(String[] args) {
        // 1、准备好一个数组
        int[] arr = {5, 1, 3, 2};
        //           0  1  2  3

        // 2、控制选择几轮
        //这里i作为的是比较者，j表示的是被比较者的下标
        for (int i = 0; i < arr.length - 1; i++) {
            // i = 0位置 第一轮选择比较    j的位置 = 1 、2 、3
            // i = 1位置 第二轮选择比较    j的位置 = 2 、3
            // i = 2位置 第三轮选择比较    j的位置 = 3
            // 3、控制每轮选择几次。          j在每轮都要走到数组的最后一个位置的元素
            for (int j = i + 1; j < arr.length; j++) {
                // 判断当前位置是否大于后面位置处的元素值，若大于则交换。
                if(arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));

        System.out.println("===============代码优化之后===========");
        //上面代码每一次比较出最小值都要交换一次值，影响性能。可以优化，改为交换索引，减少数组元素交换次数
        //做法：找出选定位置之后的元素中的最小值索引，然后再和选定位置元素的索引进行交换
        int arr1[] = {12,33,3,54,7,1,77};
        for (int i = 0; i < arr1.length-1; i++) {
            int min = i;
            for (int j = i+1; j < arr1.length; j++) {
                if (arr1[min]>arr1[j]){
                    min = j;
                }
            }
            //这样每一轮比较下来，就找到了最小值的索引
            if(i!=min){
                int temp = arr1[i];
                arr1[i] = arr1[min];
                arr1[min] = temp;
            }
        }
        System.out.println(Arrays.toString(arr1));


    }
}
